/**
 * 两个数组的交集 II
给你两个整数数组 nums1 和 nums2 ，请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数，应与元素在两个数组中都出现的次数一致（如果出现次数不一致，则考虑取较小值）。可以不考虑输出结果的顺序。

 

示例 1：

输入：nums1 = [1,2,2,1], nums2 = [2,2]
输出：[2,2]
示例 2:

输入：nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出：[4,9]
 */


/**
 * 先将数组1和数组2都排好序，然后再使用两个指针，分别指向两个数组的开始位置
 * 如果两个指针指向的值相同，说明这是塔门之间的交集，就将这个值添加到数组res中，然后两个指针分别向后移动
 * 如果两个指针指向的值不同，那么指向的值较小的向后移动一步，较大的不动，然后再比较
 * @param {*} nums1 
 * @param {*} nums2 
 */
var intersect_one = function(nums1, nums2){
    nums1.sort((a,b) => a - b)
    nums2.sort((a,b) => a - b)
    let res = []
    let i = 0, j = 0;
    while(i < nums1.length && j < nums2.length) {
        if(nums1[i] < nums2[j]) {
            i++;
        }else if(nums1[i] > nums2[j]){
            j++;
        }else {
            res.push(nums1[i])
            i++;
            j++;
        }
    }
    return res
}

/**
 * 使用map解决
 * 遍历nums1中所有的元素，把他放入map中，其中key值就是nums1中的元素，value就是这个元素再数组中nums1中出现的次数
 * 遍历nums2中的所有元素，查看map中是否包含nums2的元素，如果包含，就把当前值加入到集合list中，对应的value就要减去1
 */

var intersect_two = function(nums1, nums2) {
    let map = new Map();
    let res = [];
    // 先将数组nums1中的所有元素都存放到map中，其中key是数组中的元素，value是该元素再数组中出现的次数
    for(let i of nums1) {
        if(map[i]) {
            map[i]++;
        }else {
            map[i] = 1;
        }
    }
    // 然后再遍历nums2数组，查看map中是否包含nums2的元素，如果包含，就将值添加到res中去，并且map中对应的value值再减去1
   for(let j of nums2) {
       // 记住当前元素的个数
       let num = map[j];
       // 判断当前元素个数
       if(num > 0) {
           res.push(j);
           map[j]--;
       }
   }
    console.log(res)
    return res
}
intersect_two(nums1 = [4,9,5], nums2 = [9,4,9,8,4])